library(tidyverse) # your friend and mine
library(dagitty) # for working with DAGs
library(ggdag) # for drawing DAGs in R3.2 — DAGs — R Practice
Required Packages
Load all the required packages we will use by running (clicking the green play button) the chunk below:
set.seed(20) # using this number means all "random" generated objects will be identical for all of us!For each of the following examples:
- Write out all of the causal pathways from
X(treatment of interest) toY(outcome of interest). - Identify which variable(s) need to be controlled to estimate the causal effect of
XonY. You can usedagitty.netto help you, but you should start trying to recognize these on your own! - Draw the DAGs in
rusingggdag. After setting up the dag withdagify()(and specifyingexposureandoutcomeinsidedagify), pipe that intoggdag(). Try again piping it instead intoggdag_status()(to highlight what is X and what is Y). Try again piping it instead intoggdag_adjustment_set()to show what needs to be controlled.
Don’t forget to install ggdag and dagitty!
Question 1
Part I
Pathways:
- \(X \rightarrow Y\) (causal, front door)
- \(X \leftarrow Z \rightarrow Y\) (not causal, back door)
Part II
\(Z\) needs to be controlled for, since it is opening a backdoor path.
Part III
dag1 <- dagify(Y ~ X + Z,
X ~ Z,
exposure = "X",
outcome = "Y")
dag1 %>%
ggdag_status(seed = 1)+
theme_dag_blank()dag1 %>%
ggdag_paths(seed = 1)+
theme_dag_blank()dag1 %>%
ggdag_adjustment_set()+
theme_dag_blank()Question 2
Part I
Pathways:
- \(X \rightarrow Y\) (causal, front door)
- \(X \rightarrow M \rightarrow Y\) (causal, front door)
Part II
Nothing should be controlled for, since \(M\) is a mediator, and part of the effect of \(X\) on \(Y\)
Part III
dag2 <- dagify(Y ~ X + M,
M ~ X,
exposure = "X",
outcome = "Y")
dag2 %>%
ggdag_status(seed = 1)+
theme_dag_blank()dag2 %>%
ggdag_paths(seed = 1)+
theme_dag_blank()dag2 %>%
ggdag_adjustment_set()+
theme_dag_blank()Question 3
Part I
Pathways:
- \(X \rightarrow Y\) (causal, front door)
- \(X \leftarrow A \rightarrow Z \rightarrow Y\) (not causal, back door)
- \(X \leftarrow A \rightarrow Z \leftarrow B \rightarrow Y\) (not causal, back door)
Part II
Backdoor path 3 is closed by the collider at \(Z\). Backdoor path 2 remains open, so we need to control for \(A\). (If we blocked \(Z\) to close path 2, that would open up backdoor path 3!) Only \(A\) should be controlled for.
Alternatively, we could control for \(B\) and \(Z\).
Part III
dag3 <- dagify(Y ~ X + Z + B,
Z ~ B + A,
X ~ A,
exposure = "X",
outcome = "Y")
dag3 %>%
ggdag_status(seed = 1)+
theme_dag_blank()dag3 %>%
ggdag_paths(seed = 1)+
theme_dag_blank()dag3 %>%
ggdag_adjustment_set()+
theme_dag_blank()Question 4
Part I
Pathways:
- \(X \rightarrow Y\) (causal, front door)
- \(X \rightarrow C \rightarrow Y\) (causal, front door)
- \(X \leftarrow A \rightarrow Z \rightarrow B \rightarrow Y\) (not causal, back door)
Part II
Path 2 is a front door path we want to leave open. Backdoor path 3 is closed by the collider at \(Z\). Nothing needs to be controlled for!
Part III
dag4 <- dagify(Y ~ X + B + C,
Z ~ B + A,
X ~ A,
C ~ X,
exposure = "X",
outcome = "Y")
dag4 %>%
ggdag_status(seed = 1)+
theme_dag_blank()dag4 %>%
ggdag_paths(seed = 1)+
theme_dag_blank()dag4 %>%
ggdag_adjustment_set()+
theme_dag_blank()Question 5
Part I
Pathways:
- \(X \rightarrow Y\) (causal, front door)
- \(X \rightarrow Z \rightarrow Y\) (causal, front door)
- \(X \rightarrow Z \leftarrow A \rightarrow Y\) (not causal, back door)
- \(X \rightarrow Z \leftarrow B \rightarrow A \rightarrow Y\) (not causal, back door)
Part II
Path 2 is a front door path we want to leave open. Backdoor path 3 is closed by the collider at \(Z\). Backdoor path 4 is closed by the collider at \(Z\). We don’t want to control for anything!
Part III
dag5 <- dagify(Y ~ X + Z + A,
Z ~ X + A + B,
B ~ A,
exposure = "X",
outcome = "Y")
dag5 %>%
ggdag_status(seed = 1)+
theme_dag_blank()dag5 %>%
ggdag_paths(seed = 1)+
theme_dag_blank()dag5 %>%
ggdag_adjustment_set()+
theme_dag_blank()